package com.design01_builder.pattern01_singleton;

/**
 * @ClassName Singleton04
 * @Description 懒汉式 双重检测
 * @Author zhangjunhao
 * @DATE 2023/8/31 23:02
 */
public class Singleton04 {

    public Singleton04() {
    }

    private volatile static Singleton04 INSTANCE;


    public  static  Singleton04 getINSTANCE() {
        if (INSTANCE == null) {
            synchronized (Singleton04.class) {
                //抢到锁之后去判断是否为空
                if (INSTANCE == null) {
                    return new Singleton04();

                    /*
                    * 创建对象的代码不是原子操作
                    * 1.分配地址
                    * 2.初始化对象
                    * 3.将instance指向对象空间
                    *
                    * 可能会指令重排,所以instance要加指令重排序
                    * 使用volatile,屏蔽指令重排序
                    * */

                }
            }
        }
        return INSTANCE;
    }
}
